package com.atguigu.gmall.mq.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.CustomExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

/**
 * @author lfh
 * @version 1.0
 * @date 2021/4/29 19:49
 */
@Configuration
public class DelayedMqConfig {

    // 定义变量
    public static final String exchange_delay = "exchange.delay";
    public static final String routing_delay = "routing.delay";
    public static final String queue_delay_1 = "queue.delay.1";

    /**
     * 队列不要在RabbitListener上面做绑定，否则不会成功，如队列2，必须在此绑定
     * 创建队列
     * @return
     */
    @Bean
    public Queue delayQeue1() {
        // 消息的过期时间，以及交换机，路由键！
//        // 创建一个map
//        HashMap<String, Object> map = new HashMap<>();
//        // 参数绑定 此处的key 固定值，不能随意写
//        map.put("x-dead-letter-exchange",exchange_dead);
//        map.put("x-dead-letter-routing-key",routing_dead_2);
//        // 设置延迟时间  设置消息的TTL
//        map.put("x-message-ttl", 10 * 1000);
//        // 队列名称，是否持久化，是否独享、排外的【true:只可以在本次连接中访问】，是否自动删除，队列的其他属性参数
//        return new Queue(queue_dead_1, true,false,false,map);

        // 第一个参数是创建的queue的名字，第二个参数是是否支持持久化
        // 使用插件的时候：不需要在队列中进行设置！ 这个延迟时间在哪设置？
        return new Queue(queue_delay_1, true,false,false);
    }

    // 创建交换机
    @Bean
    public CustomExchange delayExchange(){
        // 需要在这个交换机上进行配置
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("x-delayed-type", "direct");
        return new CustomExchange(exchange_delay, "x-delayed-message", true, false, map);

    }

    // 配置绑定关系！
    @Bean
    public Binding delayBbinding1() {
        return BindingBuilder.bind(delayQeue1()).to(delayExchange()).with(routing_delay).noargs();
    }

}
